// Go 语言支持匿名函数，可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量，不必申明。
// 以下实例中，我们创建了函数 getSequence() ，返回另外一个函数。该函数的目的是在闭包中递增 i 变量
package main

import "fmt"

// 定义 getSequence() 函数，这里还多了个 func() 在后面，猜测是要弄成一个闭包
func getSequence() func() int {
   i:=0
   // 定义匿名函数，返回的就是匿名函数的结果 i
   return func() int {
      i+=1
     return i  
   }
}

func main(){
   /* nextNumber 为一个函数，函数 i 为 0 */
   // 从结果可知，每次这样执行，就会初始化闭包一次，将 i 的值重置为 0
   nextNumber := getSequence()  

   /* 调用 nextNumber 函数，i 变量自增 1 并返回 */
   // 这样执行的时候，会发现不会运行 i:=0 这一句代码，使得里面的 i 值可以递增，而且外部也不能修改，实现闭包的功能，可以用于静态计数等场景
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   
   /* 创建新的函数 nextNumber1，并查看结果 */
   // 重新执行 getSequence() 会将 i 的值重新初始化为 0
   nextNumber1 := getSequence()  
   fmt.Println(nextNumber1())
   fmt.Println(nextNumber1())
}